home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldpcx04 / ldpcx04s.lzh / LDPCX24.S < prev    next >
Text File  |  1997-06-10  |  13KB  |  646 lines

  1. *****************************************************************
  2. *    フルカラー用                        *
  3. *****************************************************************
  4.     .include    doscall.mac
  5.     .include    iocscall.mac
  6.     .include    myconst.h
  7.  
  8.     .xdef    _pcx24_prt
  9.     .xdef    _pcx24_scroll
  10.  
  11.     .xref    x_set
  12.     .xref    y_set
  13.     .xref    v_wait
  14.     .xref    inf_change
  15.     .xref    key_chk
  16.     .xref    tenkey_chk
  17.     .xref    cursor_chk
  18.     .xref    mouse_chk
  19.  
  20.     .xref    tate
  21.     .xref    yoko
  22.     .xref    x_max
  23.     .xref    y_max
  24.     .xref    x_pos
  25.     .xref    y_pos
  26.     .xref    gr_addr
  27.     .xref    kflg
  28.     .xref    mflg
  29.     .xref    esc_flg
  30.     .xref    next_flg
  31.     .xref    scroll_key
  32.     .xref    s_dot24
  33.  
  34. *****************************************************************
  35. *    表示                            *
  36. *****************************************************************
  37. _pcx24_prt:
  38.     bsr    pcx24_prt            *表示
  39.     rts
  40.  
  41. *****************************************************************
  42. *    スクロール                        *
  43. *****************************************************************
  44. _pcx24_scroll:
  45.     bsr    scroll            *スクロール
  46.     rts
  47.  
  48. *****************************************************************
  49. *    画像データを一気に表示する                *
  50. *****************************************************************
  51. pcx24_prt:
  52.     move.w    x_pos(pc),gram_x    *表示開始座標
  53.     move.w    y_pos(pc),gram_y
  54.  
  55.     clr.w    pcx_x
  56.     clr.w    pcx_y
  57.  
  58.     move.w    yoko(pc),d0
  59.     cmp.w    #512,d0            *横ドット数が512を超えるか
  60.     bls    pcx24_prt1
  61.     move.w    #512,d0
  62. pcx24_prt1:
  63.     move.w    d0,pcx_xd
  64.     move.w    d0,x_line
  65.  
  66.     move.w    tate(pc),d0
  67.     cmp.w    #512,d0            *横ドット数が512を超えるか
  68.     bls    pcx24_prt2
  69.     move.w    #512,d0
  70. pcx24_prt2:
  71.     move.w    d0,pcx_yd
  72.     move.w    d0,y_line
  73.  
  74.     bsr    get_pcx_addr
  75.     bsr    get_gram_addr
  76.  
  77.     tst.b    mflg
  78.     bne    pcx24_prt3
  79.     bsr    dma_move        *DMAで表示
  80.     bra    pcx24_prt4
  81. pcx24_prt3:
  82.     bsr    g24            *MPUで表示
  83. pcx24_prt4:
  84.     rts
  85.  
  86. *****************************************************************
  87. *    DMAを使ってグラフィックへ転送する            *
  88. *****************************************************************
  89. dma_move:
  90.     move.w    pcx_yd(pc),d0        *転送サイズ縦
  91.     move.w    pcx_xd(pc),d1        *転送サイズ横
  92.     movea.w    yoko(pc),a3        *転送元画像の横サイズ
  93.     adda.l    a3,a3
  94.  
  95.     sub.w    #1,d0            *縦ライン-1
  96.  
  97.     move.b    #$FF,CSR2
  98.     move.b    #8,DCR2
  99.  
  100.     btst.l    #0,d1            *横ライン数が偶数か
  101.     beq    dma_move0        *そう
  102.     move.b    #$11,OCR2        *ワード転送
  103.     bra    dma_move1
  104. dma_move0:
  105.     move.b    #$21,OCR2        *ロングワード転送
  106.     lsr.w    #1,d1            *d1を1/2
  107. dma_move1:
  108.     move.b    #%0_000_0101,SCR2
  109.     move.b    #3,CPR2
  110.     clr.b    CCR2
  111.     move.b    #5,DFC2
  112.     move.b    #5,MFC2
  113. dma_move2:
  114.     move.w    d1,MTC2            *転送サイズ
  115.     move.l    a1,MAR2            *転送元
  116.     move.l    a2,DAR2            *転送先
  117.     move.b    #$80,CCR2
  118. dma_move3:
  119.     tst.w    MTC2
  120.     bne    dma_move3
  121.     move.b    #$FF,CSR2
  122.     adda.l    a3,a1            *転送元アドレス更新
  123.     lea.l    1024(a2),a2        *転送先アドレス更新
  124.     dbra.w    d0,dma_move2
  125.  
  126.     rts
  127.  
  128. *****************************************************************
  129. *    スクロール制御                        *
  130. *****************************************************************
  131. scroll:
  132.     moveq.l    #0,d2            *スクロール座標初期化
  133.     moveq.l    #0,d3
  134.  
  135.     clr.w    x_old
  136.     clr.w    y_old
  137.  
  138.     bsr    down_demo
  139.     bsr    right_demo
  140.  
  141.     tst.b    kflg            *キー入力待ち
  142.     beq    scroll8            *指定無し
  143.  
  144. scroll2:
  145.     bsr    key_chk            *キー入力チェック
  146. *    bsr    mouse_chk        *マウスのキー入力チェック
  147.  
  148.     tst.b    esc_flg            *エスケープ入力有るか
  149.     bne    scroll9            *指定有り
  150.     tst.b    next_flg        *ネクスト入力有るか
  151.     bne    scroll9            *指定有り
  152.  
  153.     bsr    cursor_chk        *カーソル入力チェック
  154.     bsr    tenkey_chk        *テンキー入力チェック
  155.     bsr    mouse_chk        *マウス入力チェック
  156.     bsr    go_scroll        *スクロール実行
  157.  
  158.     bsr    v_wait            *手抜き
  159.     bra    scroll2            *キー入力に戻る
  160.  
  161. scroll8:
  162.     bsr    key_chk            *ESCくらいは入力チェック
  163.     bsr    mouse_chk        *マウスのキー入力チェック
  164.  
  165. scroll9:
  166.     rts
  167.  
  168. *****************************************************************
  169. *    下方向へ全画面スクロールを行う                *
  170. *****************************************************************
  171. down_demo:
  172.     tst.w    y_max
  173.     beq    down_demo9
  174.  
  175.     move.w    s_dot24(pc),-(sp)
  176.     lsr.w    s_dot24
  177. down_demo0:
  178.     bsr    key_chk
  179.     bsr    cursor_chk
  180.     bsr    tenkey_chk
  181.     bsr    mouse_chk
  182.     tst.b    scroll_key
  183.     bne    down_demo8
  184.     tst.b    esc_flg
  185.     bne    down_demo8
  186.     tst.b    next_flg
  187.     bne    down_demo8
  188.  
  189.     bsr    v_wait
  190.     bsr    down
  191.     cmp.w    y_max(pc),d3
  192.     bne    down_demo0
  193. down_demo8:
  194.     move.w    (sp)+,s_dot24
  195. down_demo9:
  196.     rts
  197.  
  198. *****************************************************************
  199. *    右方向へ全画面スクロールを行う                *
  200. *****************************************************************
  201. right_demo:
  202.     tst.w    x_max
  203.     beq    right_demo9
  204.     tst.w    d3
  205.     bne    right_demo9
  206. *    move.w    y_max(pc),d0
  207. *    cmp.w    x_max(pc),d0
  208. *    bhi    right_demo9
  209.  
  210.     move.w    s_dot24(pc),-(sp)
  211.     lsr.w    s_dot24
  212. right_demo0:
  213.     bsr    key_chk
  214.     bsr    cursor_chk
  215.     bsr    tenkey_chk
  216.     bsr    mouse_chk
  217.     tst.b    scroll_key
  218.     bne    right_demo8
  219.     tst.b    esc_flg
  220.     bne    right_demo8
  221.     tst.b    next_flg
  222.     bne    right_demo8
  223.  
  224.     bsr    v_wait
  225.     bsr    right
  226.     cmp.w    x_max(pc),d2
  227.     bne    right_demo0
  228. right_demo8:
  229.     move.w    (sp)+,s_dot24
  230. right_demo9:
  231.     rts
  232.  
  233. *****************************************************************
  234. *    スクロール                        *
  235. *****************************************************************
  236. go_scroll:
  237.     moveq.l    #0,d0
  238.     move.b    scroll_key(pc),d0
  239.     add.w    d0,d0
  240.     add.w    d0,d0
  241.     movea.l    scroll_tbl(pc,d0.w),a0
  242.     jsr    (a0)
  243.     rts
  244.  
  245. scroll_tbl:
  246.     .dc.l    null            *0000    入力無し
  247.     .dc.l    left            *0001    左
  248.     .dc.l    up            *0010    上
  249.     .dc.l    left_up            *0011    上左
  250.     .dc.l    right            *0100    右
  251.     .dc.l    null            *0101    右左
  252.     .dc.l    right_up        *0110    右上
  253.     .dc.l    up            *0111    右上左
  254.     .dc.l    down            *1000    下
  255.     .dc.l    left_down        *1001    下左
  256.     .dc.l    null            *1010    下上
  257.     .dc.l    left            *1011    下上左
  258.     .dc.l    right_down        *1100    下右
  259.     .dc.l    down            *1101    下右左
  260.     .dc.l    right            *1110    下右上
  261.     .dc.l    null            *1111    下右上左
  262.     .even
  263.  
  264. *****************************************************************
  265. *    入力無し                        *
  266. *****************************************************************
  267. null:
  268.     rts
  269.  
  270. *****************************************************************
  271. *    右下(手抜き)                        *
  272. *****************************************************************
  273. right_down:
  274.     bsr    right
  275.     bsr    down
  276.     rts
  277.  
  278. *****************************************************************
  279. *    左下(手抜き)                        *
  280. *****************************************************************
  281. left_down:
  282.     bsr    left
  283.     bsr    down
  284.     rts
  285.  
  286. *****************************************************************
  287. *    右上(手抜き)                        *
  288. *****************************************************************
  289. right_up:
  290.     bsr    right
  291.     bsr    up
  292.     rts
  293.  
  294. *****************************************************************
  295. *    左上(手抜き)                        *
  296. *****************************************************************
  297. left_up:
  298.     bsr    left
  299.     bsr    up
  300.     rts
  301.  
  302. *****************************************************************
  303. *    左へ                            *
  304. *****************************************************************
  305. left:
  306.     sub.w    s_dot24(pc),d2
  307.     tst.w    d2
  308.     bpl    left1
  309.     clr.w    d2
  310. left1:
  311.     bsr    x_set
  312.  
  313.     move.w    x_old(pc),d5        *何ドットずらすか
  314.     sub.w    d2,d5
  315.     beq    left9
  316.  
  317.     move.w    d2,d0            *表示開始X座標
  318.     add.w    x_pos(pc),d0
  319.     and.w    #$1ff,d0
  320.     move.w    d0,gram_x
  321.  
  322.     move.w    y_old(pc),d0        *表示開始Y座標
  323.     add.w    y_pos(pc),d0
  324.     and.w    #$1ff,d0
  325.     move.w    d0,gram_y
  326.  
  327.     move.w    d2,pcx_x
  328.     move.w    d5,pcx_xd
  329.     move.w    y_old(pc),pcx_y
  330.     move.w    y_line(pc),pcx_yd
  331.  
  332.     bsr    get_pcx_addr        *表示
  333.     bsr    get_gram_addr
  334.     bsr    g24
  335.  
  336.     move.w    d2,x_old
  337. left9:
  338.     rts
  339.  
  340. *****************************************************************
  341. *    上へ                            *
  342. *****************************************************************
  343. up:
  344.     sub.w    s_dot24(pc),d3
  345.     tst.w    d3
  346.     bpl    up1
  347.     clr.w    d3
  348. up1:
  349.     move.w    y_old(pc),d6        *何ドットずらすか
  350.     sub.w    d3,d6
  351.     beq    up9
  352.  
  353.     move.w    x_old(pc),d0        *表示開始X座標
  354.     add.w    x_pos(pc),d0
  355.     and.w    #$1ff,d0
  356.     move.w    d0,gram_x
  357.  
  358.     move.w    d3,d0            *表示開始Y座標
  359.     add.w    y_pos(pc),d0
  360.     and.w    #$1ff,d0
  361.     move.w    d0,gram_y
  362.  
  363.     move.w    x_old(pc),pcx_x
  364.     move.w    x_line(pc),pcx_xd
  365.     move.w    d3,pcx_y
  366.     move.w    d6,pcx_yd
  367.  
  368.     bsr    get_pcx_addr
  369.     bsr    get_gram_addr
  370.     bsr    g24
  371.  
  372.     bsr    y_set
  373.  
  374.     move.w    d3,y_old
  375. up9:
  376.     rts
  377.  
  378. *****************************************************************
  379. *    右へ                            *
  380. *****************************************************************
  381. right:
  382.     add.w    s_dot24(pc),d2
  383.     cmp.w    x_max(pc),d2
  384.     bls    right1
  385.     move.w    x_max(pc),d2
  386. right1:
  387.     bsr    x_set
  388.  
  389.     move.w    d2,d5            *何ドットずらすか
  390.     sub.w    x_old(pc),d5
  391.     beq    right9
  392.  
  393.     move.w    x_old(pc),d0        *表示開始X座標
  394.     add.w    x_pos(pc),d0
  395.     add.w    #512,d0
  396.     and.w    #$1ff,d0
  397.     move.w    d0,gram_x
  398.  
  399.     move.w    y_old(pc),d0        *表示開始Y座標
  400.     add.w    y_pos(pc),d0
  401.     and.w    #$1ff,d0
  402.     move.w    d0,gram_y
  403.  
  404.     move.w    x_old(pc),pcx_x
  405.     add.w    #512,pcx_x
  406.     move.w    d5,pcx_xd
  407.     move.w    y_old(pc),pcx_y
  408.     move.w    y_line(pc),pcx_yd
  409.  
  410.     bsr    get_pcx_addr        *表示
  411.     bsr    get_gram_addr
  412.     bsr    g24
  413.  
  414.     move.w    d2,x_old
  415. right9:
  416.     rts
  417.  
  418. *****************************************************************
  419. *    下へ                            *
  420. *****************************************************************
  421. down:
  422.     add.w    s_dot24(pc),d3
  423.     cmp.w    y_max(pc),d3
  424.     bls    down1
  425.     move.w    y_max(pc),d3
  426. down1:
  427.     bsr    y_set
  428.  
  429.     move.w    d3,d6            *何ドットずらすか
  430.     sub.w    y_old(pc),d6
  431.     beq    down9
  432.  
  433.     move.w    x_old(pc),d0        *表示開始X座標
  434.     add.w    x_pos(pc),d0
  435.     and.w    #$1ff,d0
  436.     move.w    d0,gram_x
  437.  
  438.     move.w    y_old(pc),d0        *表示開始Y座標
  439.     add.w    y_pos(pc),d0
  440.     and.w    #$1ff,d0
  441.     move.w    d0,gram_y
  442.  
  443.     move.w    x_old(pc),pcx_x
  444.     move.w    x_line(pc),pcx_xd
  445.     move.w    y_old(pc),pcx_y
  446.     add.w    #512,pcx_y
  447.     move.w    d6,pcx_yd
  448.  
  449.     bsr    get_pcx_addr        *表示
  450.     bsr    get_gram_addr
  451.     bsr    g24
  452.  
  453.     move.w    d3,y_old
  454. down9:
  455.     rts
  456.  
  457. *****************************************************************
  458. *    スクロール分のグラフィックを表示する            *
  459. *    gram_x, gram_y  表示先座標(GRAM)            *
  460. *    pcx_x,  pcx_y   表示元座標(PCX)                *
  461. *    pcx_xd, pcx_yd  ドット数                *
  462. *****************************************************************
  463. g24:
  464.     movem.l    d5-d6,-(sp)
  465.     move.w    pcx_xd(pc),d0        *横ドット数
  466.     move.w    pcx_yd(pc),d7        *縦ドット数
  467.  
  468.     move.w    yoko(pc),d4        *次のラインへのバイト数
  469.     sub.w    d0,d4            *(転送元)
  470.     add.w    d4,d4
  471.  
  472.     move.w    #512,d5            *表示データの1ライン下までの差分
  473.     sub.w    d0,d5            *(表示先)
  474.     add.w    d5,d5
  475.  
  476.     move.w    gram_x(pc),d6
  477.     add.w    pcx_xd(pc),d6
  478.     cmp.w    #512,d6
  479.     bhi    g24_2            *左右2回に分けて表示
  480.  
  481.     cmp.w    #1,d0            *表示ライン=横1ドット
  482.     beq    g24_1
  483.  
  484.     cmp.w    #8,d0            *表示ライン=横8ドット
  485.     beq    g24_8
  486.  
  487.     btst.l    #0,d0
  488.     beq    g24_g            *表示ライン=偶数
  489.     bra    g24_k            *表示ライン=奇数
  490.  
  491. g24_1:
  492.     subq.w    #1,d7            *dbraのため縦-1
  493. g24_11:
  494.     move.w    (a1)+,(a2)+
  495.     adda.w    d4,a1            *変換元アドレス更新
  496.     adda.w    d5,a2            *表示先アドレス更新
  497.     cmpa.l    a3,a2
  498.     bcs    g24_13
  499.     suba.l    #GRAM_MAX-GRAM,a2
  500. g24_13:
  501.     dbra    d7,g24_11
  502.     bra    g24_end
  503.  
  504. g24_8:
  505.     subq.w    #1,d7            *dbraのため縦-1
  506. g24_81:
  507.     move.l    (a1)+,(a2)+
  508.     move.l    (a1)+,(a2)+
  509.     move.l    (a1)+,(a2)+
  510.     move.l    (a1)+,(a2)+
  511.     adda.w    d4,a1            *変換元アドレス更新
  512.     adda.w    d5,a2            *表示先アドレス更新
  513.     cmpa.l    a3,a2
  514.     bcs    g24_83
  515.     suba.l    #GRAM_MAX-GRAM,a2
  516. g24_83:
  517.     dbra    d7,g24_81
  518.     bra    g24_end
  519.  
  520. g24_g:
  521.     lsr.w    #1,d0            *1/2
  522.     subq.w    #1,d0            *dbraのため-1
  523.     subq.w    #1,d7            *dbraのため-1
  524. g24_g1:
  525.     move.w    d0,d1
  526. g24_g2:
  527.     move.l    (a1)+,(a2)+
  528.     dbra    d1,g24_g2
  529.     adda.w    d4,a1            *変換元アドレス更新
  530.     adda.w    d5,a2            *表示先アドレス更新
  531.     cmpa.l    a3,a2
  532.     bcs    g24_g3
  533.     suba.l    #GRAM_MAX-GRAM,a2
  534. g24_g3:
  535.     dbra    d7,g24_g1
  536.     bra    g24_end
  537.  
  538. g24_k:
  539.     lsr.w    #1,d0            *1/2
  540.     subq.w    #1,d0            *dbraのため-1
  541.     subq.w    #1,d7            *dbraのため-1
  542. g24_k1:
  543.     move.w    d0,d1
  544. g24_k2:
  545.     move.l    (a1)+,(a2)+
  546.     dbra    d1,g24_k2
  547.     move.w    (a1)+,(a2)+
  548.     adda.w    d4,a1            *変換元アドレス更新
  549.     adda.w    d5,a2            *表示先アドレス更新
  550.     cmpa.l    a3,a2
  551.     bcs    g24_k3
  552.     suba.l    #GRAM_MAX-GRAM,a2
  553. g24_k3:
  554.     dbra    d7,g24_k1
  555.     bra    g24_end
  556.  
  557. g24_2:                    *左右2回に分けて表示
  558.     add.w    #1024,d5        *1ライン下までの差分を補正
  559.  
  560.     move.w    #512,d0            *横ドット1
  561.     sub.w    gram_x(pc),d0
  562.     move.w    pcx_xd(pc),d6        *横ドット2
  563.     sub.w    d0,d6
  564.  
  565.     subq.w    #1,d0            *dbraのため-1
  566.     subq.w    #1,d6            *dbraのため-1
  567.     subq.w    #1,d7            *dbraのため-1
  568. g24_21:
  569.     move.w    d0,d1            *右側
  570. g24_22:
  571.     move.w    (a1)+,(a2)+
  572.     dbra    d1,g24_22
  573. g24_23:
  574.     move.w    d6,d1            *左側
  575.     lea.l    -1024(a2),a2
  576. g24_24:
  577.     move.w    (a1)+,(a2)+
  578.     dbra    d1,g24_24
  579.  
  580.     adda.w    d4,a1            *変換元アドレス更新
  581.     adda.w    d5,a2            *表示先アドレス更新
  582.     cmpa.l    a3,a2
  583.     bcs    g24_25
  584.     suba.l    #GRAM_MAX-GRAM,a2
  585. g24_25:
  586.     dbra    d7,g24_21
  587.  
  588. g24_end:
  589.     movem.l    (sp)+,d5-d6
  590.     rts
  591.  
  592. *****************************************************************
  593. *    PCXデータのアドレスを取得(a1)                *
  594. *****************************************************************
  595. get_pcx_addr:
  596.     move.w    yoko(pc),d0        *yoko*2*pcx_y+pcx_x*2+gr_addr
  597.     add.w    d0,d0
  598.     mulu.w    pcx_y(pc),d0
  599.     add.l    gr_addr(pc),d0
  600.     movea.l    d0,a1
  601.     move.w    pcx_x(pc),d1
  602.     add.w    d1,d1
  603.     adda.w    d1,a1
  604.     rts
  605.  
  606. *****************************************************************
  607. *    GRAMのアドレスを取得(a2)                *
  608. *****************************************************************
  609. get_gram_addr:
  610.     move.w    gram_x(pc),d0        *表示先画像アドレス
  611.     move.w    gram_y(pc),d1
  612.     swap.w    d1
  613.     clr.w    d1
  614.     ror.l    #6,d1
  615.     add.w    d0,d0
  616.     add.w    d0,d1
  617.     movea.l    d1,a2
  618.     adda.l    #GRAM,a2
  619.  
  620.     movea.l    #GRAM_MAX,a3        *GRAM_MAX
  621.     rts
  622.  
  623. *****************************************************************
  624. *    ワークエリア                        *
  625. *****************************************************************
  626.     .bss
  627.     .even
  628.  
  629. gram_x    .ds.w    1            *表示する座標(GRAM)
  630. gram_y    .ds.w    1
  631.  
  632. pcx_x    .ds.w    1            *表示する座標(PCX)
  633. pcx_y    .ds.w    1
  634. pcx_xd    .ds.w    1            *表示するドット数
  635. pcx_yd    .ds.w    1
  636.  
  637. x_line:
  638.     .ds.w    1            *横ドット数
  639. y_line:
  640.     .ds.w    1            *縦ドット数
  641. x_old:
  642.     .ds.w    1            *前回のX座標
  643. y_old:
  644.     .ds.w    1            *前回のY座標
  645.     .even
  646.